/*
 * jQuery Hotkeys Plugin
 * Copyright 2010, John Resig
 *
 * Based upon the plugin by Tzury Bar Yochay:
 * http://github.com/tzuryby/hotkeys
 *
 * Original idea by:
 * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
*/
/* eslint indent: ['error', 'tab'], one-var: ['error', 'always'] */
export default function (jQuery) {
	jQuery.hotkeys = {
		version: '0.8',
		specialKeys: {
			8: 'backspace', 9: 'tab', 13: 'return', 16: 'shift', 17: 'ctrl', 18: 'alt', 19: 'pause',
			20: 'capslock', 27: 'esc', 32: 'space', 33: 'pageup', 34: 'pagedown', 35: 'end', 36: 'home',
			37: 'left', 38: 'up', 39: 'right', 40: 'down', 45: 'insert', 46: 'del',
			96: '0', 97: '1', 98: '2', 99: '3', 100: '4', 101: '5', 102: '6', 103: '7',
			104: '8', 105: '9', 106: '*', 107: '+', 109: '-', 110: '.', 111: '/',
			112: 'f1', 113: 'f2', 114: 'f3', 115: 'f4', 116: 'f5', 117: 'f6', 118: 'f7', 119: 'f8',
			120: 'f9', 121: 'f10', 122: 'f11', 123: 'f12', 144: 'numlock', 145: 'scroll', 191: '/', 224: 'meta'
		},
		shiftNums: {
			'`': '~', '1': '!', '2': '@', '3': '#', '4': '$', '5': '%', '6': '^', '7': '&',
			'8': '*', '9': '(', '0': ')', '-': '_', '=': '+', ';': ': ', '"': '\'', ',': '<',
			'.': '>', '/': '?', '\\': '|'
		}
	}

	function keyHandler (handleObj) {
		// Only care when a possible input has been specified
		if (typeof handleObj.data !== 'string') {
			return
		}

		var origHandler = handleObj.handler,
			keys = handleObj.data.toLowerCase().split(' '),
			textAcceptingInputTypes = ['text', 'password', 'number', 'email', 'url', 'range', 'date', 'month', 'week', 'time', 'datetime', 'datetime-local', 'search', 'color']

		handleObj.handler = function (event) {
			// Don't fire in text-accepting inputs that we didn't directly bind to
			if (this !== event.target && (/textarea|select/i.test(event.target.nodeName) ||
				jQuery.inArray(event.target.type, textAcceptingInputTypes) > -1)) {
				return
			}

			// Keypress represents characters, not special keys
			var special = event.type !== 'keypress' && jQuery.hotkeys.specialKeys[ event.which ],
				character = String.fromCharCode(event.which).toLowerCase(),
				modif = '', possible = {}

			// check combinations (alt|ctrl|shift+anything)
			if (event.altKey && special !== 'alt') {
				modif += 'alt+'
			}

			if (event.ctrlKey && special !== 'ctrl') {
				modif += 'ctrl+'
			}

			// TODO: Need to make sure this works consistently across platforms
			if (event.metaKey && !event.ctrlKey && special !== 'meta') {
				modif += 'meta+'
			}

			if (event.shiftKey && special !== 'shift') {
				modif += 'shift+'
			}

			if (special) {
				possible[ modif + special ] = true
			} else {
				possible[ modif + character ] = true
				possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true

				// '$' can be triggered as 'Shift+4' or 'Shift+$' or just '$'
				if (modif === 'shift+') {
					possible[ jQuery.hotkeys.shiftNums[ character ] ] = true
				}
			}

			for (let i = 0, l = keys.length; i < l; i++) {
				if (possible[ keys[i] ]) {
					return origHandler.apply(this, arguments)
				}
			}
		}
	}

	jQuery.each([ 'keydown', 'keyup', 'keypress' ], function () {
		jQuery.event.special[ this ] = { add: keyHandler }
	})
}
